fn main() {
    let mut s = String::from("nhooo");
    let slice = &s[0..3];
    //这段程序不正确。
    // s 被部分引用，禁止更改其值。
    //s.push_str("yes!"); 错误
    println!("slice = {}", slice);

    // 有一个快速的办法可以将 String 转换成 &str：
    //在 Rust 中有两种常用的字符串类型：str 和 String。str 是 Rust 核心语言类型，
    // 就是本章一直在讲的字符串切片（String Slice），常常以引用的形式出现（&str）。
    //凡是用双引号包括的字符串常量整体的类型性质都是 &str：
    let s1 = String::from("hello");
    let s2 = &s1[..];
    println!("s2 = {}", s2);
    let arr = [1, 3, 5, 7, 9];
    let part = &arr[0..3];
    for i in part.iter() {
        println!("{}", i);
    }
    //注意：如果你常用 C/C++，请记住在 Rust 里 struct 语句仅用来定义，不能声明示例，
    //结尾不需要 ; 符号，而且每个字段定义之后用 , 分隔。
    struct Site {
        domain: String,
        name: String,
        nation: String,
        found: u32
    }
    let mut site = Site {
        domain: String::from("www.rust-lang.org"),
        name: String::from("Rust"),
        nation: String::from("China"),
        found: 2010
    };
    println!("{}", site.domain);
    site.domain = String::from("www.rust-lang.org");
    println!("{}", site.domain);
    println!("{}", site.name);
    println!("{}", site.nation);
    println!("{}", site.found);

    //有一种更简单的定义和使用结构体的方式：元组结构体。
    //元组结构体是一种形式是元组的结构体。
    //与元组的区别是它有名字和固定的类型格式。它存在的意义是为了处理那些需要定义类型（经常使用）
    // 又不想太复杂的简单数据：
    struct Color(u8, u8, u8);
    struct Point(f64, f64);
    let black = Color(0, 0, 0);
    let origin = Point(0.0, 0.0);
    println!("black=({},{},{})", black.0, black.1, black.2);
    println!("origin=({},{})", origin.0, origin.1);

    //结构体所有权
    //结构体必须掌握字段值所有权，因为结构体失效的时候会释放所有字段。

    struct Person {
        name: String,
        age: u8
    }
    let p = Person {
        name: String::from("Nhooo"),
        age: 18
    };
}
